/**
 * 
 */
package com.study.singleton;

import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;

import org.springframework.core.task.support.ExecutorServiceAdapter;

/**
 * 
 * 实现单例模式有4个步骤： 1) 静态私有属性 2) 私有构造方法 3) 公有的静态的获取实例的方法 4) 公有的业务方法
 * 
 * @author Administrator
 * @date 2019年6月24日
 */
//枚举形式实现单例: 枚举能够绝对有效的防止实例化多次,和防止反射和序列化破解
public enum SingletonV6 {

	INSTANCE000 {
		public String getPersonName() {
			return "INSTANCE000";   //INSTANCE000实例后面的{…}就是属于A的实例方法，可以通过覆盖原本的方法，实现属于自己的定制。 
		}
	}, 
	INSTANCE;  //INSTANCE 看作SingletonV6的一个实例
	
	//枚举能够绝对有效的防止实例化多次,和防止反射和序列化破解
	private Person person = new Person("xiaoming");

	static int value = 100;
    public static int getValue() {
        return value;
    }
    
	// 4、公有业务方法
	public String getPersonName() {
		return person.getName();
	}

	class Person {
		private String name;

		public Person(String n) {
			this.name = n;
		}

		public String getName() {
			return name;
		}
	}

	public static void main(String[] args) {
		SingletonV6 instance1 = SingletonV6.INSTANCE;
		SingletonV6 instance2 = SingletonV6.INSTANCE;
		System.out.println(instance1 == instance2);
		System.out.println("枚举类的实例方法： " + SingletonV6.INSTANCE.getPersonName());
		System.out.println("枚举类的类方法: " + SingletonV6.getValue()); //调用类方法也是通过  SingletonV6.getValue()即可调用
		System.out.println(SingletonV6.INSTANCE.getValue());
		System.out.println("枚举类的定制的实例方法： " + SingletonV6.INSTANCE000.getPersonName());
	}
}
